#ifndef MANEJADOR_PATRICIA_H
#define MANEJADOR_PATRICIA_H
#include "../../estructuras/ArbolPatriciaTrie/PatriciaTrie.h"
#include "InfoTerminoIndexado.h"

typedef std::string tClavePatricia;
typedef tIdTermino tDatoPatricia;

typedef PatriciaTrie<tClavePatricia, tDatoPatricia> tArbolPatricia;

/*
 * manejador de el arbol Patricia para realizar las operaciones en el mismo,
 * como son el insertar, borrar, y actualizar un nodo respectivamente y su respectivo
 * mapeo en la info de los terminos indexados.
 *
 * UNA COSA ES EL ARBOL PATRICIA QUE TIENE LOS TERMINOS INDEXADOS
 * Y OTRA COSA ES OTRA ESTRUCTURA QUE ES UNA 'LISTA' QUE CONTIENE
 * LA INFO DE LOS TERMINOS INDEXADOS!
 *
 * */

class ManejadorPatricia{

private:
	//todo (Ariel)a mi que quedaba persistir el arbol Patricia, hacerlo!!!
	tArbolPatricia* arbolPatricia;

	/*
	 * cada nodo de esta lista tiene como Id el IdTermino de el termino indexado.
	 * A ese nodo se lo accede por referencia mediante el IdTermino correspondiente
	 * que esta insertado en el Arbol Patricia representado mediante el dato de un
	 * nodo en el arbol.
	 *
	 *todo (Ariel): analizar como calcular esa referencia.
	 *todo (Ariel): hacer que esta lista no este completa en memoria al mismo tiempo que esta creando el arbol patricia.
	 * */
	Lista<InfoTerminoIndexado*>* infoTerminosIndexados;

public:
	/*crea una instancia de Patricia
	 * */
	ManejadorPatricia();

	tArbolPatricia* getArbolPatricia();

	Lista<InfoTerminoIndexado*>* getInfoTerminosIndexados();

	/*
	 *post1: Inserta los terminos a indexar en el arbol patricia
	 *post2: Inserta la info de los terminos a indexar en la lista 'infoTerminosIndexados'
	 * */
	void actualizar(tClavePatricia termino, tIdDoc IdDoc);

	void insertarTermino(tClavePatricia termino, tIdDoc IdDoc);

	/*
	 * se elimina el termino indexado en el arbol patricia y tambien la info asociada a ese termino
	 * identificado mediante el IdTermino(Dato de el nodo Patricia)
	 * */
	bool eliminarTermino(tClavePatricia termino);

	//todo (Ariel)terminar de actualizar las tres operaciones basicas:
	//todo (alta, baja, modificacion). El cuando realizar una u otra operacion que lo podria decidir el Indexador


	void actualizarTermino();

	~ManejadorPatricia();

private:

	/*
	 * para transformar un termino en su Id correspondiente.
	 * por ahora se esta usando una tecnica que puede que no sea segura.
	 * */
	tIdTermino crearIdTermino(tClavePatricia termino) const;
};
#endif
